package com.dabai.iot.core.utils;

import com.dabai.common.core.utils.Func;
import com.dabai.common.tdengine.model.TDField;
import com.dabai.iot.core.entity.ThingModelItemEntity;
import com.dabai.iot.core.tsl.TslPropDataType;

import java.util.List;
import java.util.Map;

public class IotTDField extends TDField {

    /**
     * 默认的 tag 标签字段
     */
    public static List<TDField> TAG_LIST = List.of(
            new TDField("device_sn", TYPE_NCHAR, 64)
    );

    public static List<TDField> form(List<ThingModelItemEntity> properties) {
        return properties.stream()
                .map(IotTDField::form)
                .toList();
    }

    public static TDField form(ThingModelItemEntity property) {
        TDField field = new TDField();
        field.setField(property.getIdentifier());
        // 获取字段类型
        String dataType = property.getDataType();
        field.setType(getFieldType(dataType));
        // 获取字段长度
        Integer length = property.getTextLength();
        field.setLength(getFieldLength(dataType, length));
        return field;
    }

    /**
     * 物模型到td数据类型映射
     */
    private static final Map<String, String> TYPE_MAPPING = Map.of(
            TslPropDataType.INT32.getType(), "INT",
        TslPropDataType.FLOAT.getType(), "FLOAT",
        TslPropDataType.BOOL.getType(), "BOOL",
//            EThingModelDataType.TYPE_ENUM, "TINYINT",


//            EThingModelDataType.TYPE_DOUBLE, "DOUBLE",
//            EThingModelDataType.TYPE_DATE, "TIMESTAMP",
        TslPropDataType.TEXT.getType(), TYPE_NCHAR
//            EThingModelDataType.TYPE_ARRAY, TYPE_NCHAR,
//            EThingModelDataType.TYPE_STRUCT, TYPE_NCHAR
    );

    /**
     * 获取数据库字段类型
     *
     * @return 字段类型
     */
    public static String getFieldType(String dataType) {
        return TYPE_MAPPING.get(dataType);
    }

    /**
     * 获取字段长度
     *
     * @param dataType dataType
     * @param length   length
     * @return 字段长度
     */
    public static int getFieldLength(String dataType, Integer length) {
        if (TslPropDataType.TEXT.getType().equals(dataType)) {
            return Func.toInt(length, 64);
        }

        return -1;
    }

}
